/**节流
 * @param {function} fn 需要执行的函数
 * @param {number} interval 指定多久无法重复触发，默认1s
 * @example
 * const demo = throttle(fn,2000)
 * demo()*/
export function throttle(fn,interval = 1000){
    //计时器id
    let time = null
    //返回一个函数
    function _throttle(...args){
        if(time === null){
            //调用接收的函数
            fn.apply(this,args)
            //设置定时器
            time = setTimeout(()=>{
                //指定时间后清除
                clearTimeout(time)
                time = null
            },interval)
        }
    }
    return _throttle
}

/**防抖
 * @param {function} fn 需要执行的函数
 * @param {number} delay 延迟时间，默认500ms
 * @param {boolean} immediate 是否立即执行，默认false
 * @example
 * const demo = debounce(fn,1000,true)
 * demo()*/
export function debounce(fn,delay=500,immediate=false){
    //计时器
    let timer = null
    //返回一个函数
    function _debounce(...args){
        //清除定时器
        clearTimeout(timer)
        if(immediate){
            //立即执行
            const isFirst = !timer
            timer = setTimeout(()=>{
                timer = null
            },delay)
            //立刻执行函数
            if(isFirst) fn.apply(this,args)
        }else{
            //延迟执行
            timer = setTimeout(()=>{
                fn.apply(this,args)
            },delay)
        }
    }
    return _debounce
}